//
//  StudioManagerTool.h
//  AnotherMediaTool
//
//  Created by fh on 2018/8/31.
//  Copyright © 2018年 fh. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "StudioConfiguration.h"

/**
 闪光灯模式
 
 - FlashModeOff: 关
 - FlashModeOn: 开
 - FlashModeAuto: 自动
 */
typedef NS_ENUM(NSInteger, FlashMode) {
    FlashModeOff  = 0,
    FlashModeOn   = 1,
    FlashModeAuto = 2,
};

/**
 手电筒模式

 - TorchModeOff: 关
 - TorchModeOn: 开
 - TorchModeAuto: 自动
 */
typedef NS_ENUM(NSInteger, TorchMode) {
    TorchModeOff = 0,
    TorchModeOn = 1,
    TorchModeAuto = 2,
};

/**
 曝光模式

 - ExposureModeLocked: 指示曝光应锁定在当前值
 - ExposureModeAutoExpose: 指示设备应自动调整曝光一次，然后将曝光模式改为AVCaptureExposureModeLocked
 - ExposureModeContinuousAutoExposure: 指示设备应在需要时自动调整曝光
 - ExposureModeCustom: 根据用户提供的ISO、exposureDuration值调整曝光
 */
typedef NS_ENUM(NSInteger, ExposureMode) {
    ExposureModeLocked,
    ExposureModeAutoExpose,
    ExposureModeContinuousAutoExposure,
    ExposureModeCustom
};

@protocol StudioRecordToolDelegate <NSObject>
@optional;
/**
 视频录制完成的代理方法
 
 @param videoOutputFileURL 录制的视频路径
 @param videoRecordError 错误信息
 */
- (void)didFinishVideoRecordToOutputFileAtURL:(NSURL *)videoOutputFileURL recordError:(NSError *)videoRecordError;

/**
 拍照完成的代理方法
 
 @param resultImage 照片
 @param imageFilePath 保存的照片路径
 @param photographError 错误信息
 */
- (void)didFinishPhotoPickupToImage:(UIImage *)resultImage photoFilePath:(NSString *)imageFilePath photographError:(NSError *)photographError;

/**
 录音完成的代理方法

 @param audioOutputFilePath 录音输出路径
 @param audioRecordError 录音错误信息
 */
- (void)didFinishAudioRecordToOutputFileAtPath:(NSString *)audioOutputFilePath recordError:(NSError *)audioRecordError;

@end


/**
 视频录制,录音和拍照功能工具类:单纯集成采集功能,没有播放功能
 */
@interface StudioRecordTool : NSObject

@property (nonatomic, weak) id<StudioRecordToolDelegate> delegate;
/** 是否正在录制中 */
@property (nonatomic, readonly, assign) BOOL isRecording;
/** 视频保存的文件夹路径,默认保存在DocumentDirectory */
@property (nonatomic, readwrite, strong) NSString *videoSaveDirectory;
/** 照片保存的文件夹路径,默认保存在DocumentDirectory */
@property (nonatomic, readwrite, strong) NSString *photoSaveDirectory;
/** 录音保存的文件夹路径,默认保存在DocumentDirectory */
@property (nonatomic, readwrite, strong) NSString *audioSaveDirectory;
/** 闪光灯模式 */
@property (nonatomic, readwrite, assign) FlashMode flashMode;
/** 手电筒模式 */
@property (nonatomic, readwrite, assign) TorchMode torchMode;
@property (nonatomic, readwrite, assign) ExposureMode exposureMode;
/** 拍照模式的焦距 */
@property (nonatomic, readwrite, assign) CGFloat photoVideoScaleAndCropFactor;
/** 拍照模式最小变焦 */
@property (nonatomic, readonly, assign) CGFloat photoMinScaleAndCropFactor;
/** 拍照模式最大变焦 */
@property (nonatomic, readonly, assign) CGFloat photoMaxScaleAndCropFactor;
/** 是否覆盖存储视频:最新拍摄的视频会覆盖原来的视频,默认NO */
@property (nonatomic, readwrite, assign) BOOL coverStoreVideo;
/** 是否覆盖存储照片:最新拍摄的招牌呢会覆盖原来的照片,默认NO */
@property (nonatomic, readwrite, assign) BOOL coverStorePhoto;
/** 是否保存照片到沙盒:默认YES */
@property (nonatomic, readwrite, assign) BOOL saveToSandbox;
/** 音视频压缩编码配置类:设置只读为了初始化一个默认配置,可以通过重新设置configuration的属性修改 */
@property (nonatomic, readwrite, strong) StudioConfiguration *configuration;

/** 视频录制中断事件回调:
    iOS9以上的中断原因:
        AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableInBackground               = 1,
        AVCaptureSessionInterruptionReasonAudioDeviceInUseByAnotherClient                   = 2,
        AVCaptureSessionInterruptionReasonVideoDeviceInUseByAnotherClient                   = 3,
        AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableWithMultipleForegroundApps = 4,
        AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableDueToSystemPressure NS_AVAILABLE_IOS(11_1) = 5,
    iOS9以下 interruptedReason统一为0:
 */
@property (nonatomic, copy) void(^videoRecordWasInterruptedBlock)(NSInteger interruptedReason);

/** 程序进入后台视频录制被打断的事件回调 */
@property (nonatomic, copy) void(^videoRecordDidEnterBackgroundWasInterruptedBlock)(NSURL *outputFileURL, NSError *videoRecordError, int videoDuration, float videoSize);

/**
 初始化拍照功能
 
 @return 初始化的StudioManagerTool对象
 */
- (instancetype)initDefaultPhoto;

/**
 初始化视频录制功能

 @return 初始化的StudioManagerTool对象
 */
- (instancetype)initDefaultVideo;

/**
 配置预览窗口
 
 @param view 父类视图
 @param previewFrame 预览窗口尺寸
 */
- (void)configurePreviewWithView:(UIView *)view frame:(CGRect)previewFrame;

/**
 开始录制视频
 */
- (void)startVideoRecord;

/**
 停止录制视频
 */
- (void)stopVideoRecord;

/**
 停止录制视频并回调结果
 
 @param completion 录制结果回调:使用该方法将不会进行结果回调将不会通过代理回调结果,所以要使用代理方法回调结果的话使用方法stopRecording停止录制,优先使用block回调
 */
- (void)stopVideoRecordWithCompletion:(void(^)(NSURL *outputFileURL, NSError *videoRecordError))completion;

/**
 停止录制视频并回调录制详细结果
 
 @param completion 录制详细结果回调:使用该方法将不会进行结果回调将不会通过代理回调结果,所以要使用代理方法回调结果的话使用方法stopRecording停止录制,优先使用stopVideoRecordWithCompletion回调,优先级排第二; videoDuration: 视频长度/秒, videoSize: 视频大小/MB
 */
- (void)stopVideoRecordWithDetailCompletion:(void(^)(NSURL *outputFileURL, NSError *videoRecordError, int videoDuration, float videoSize))completion;

/**
 停止录制视频并回调录制的所有详细结果

 @param completion 录制详细结果回调:使用该方法将不会进行结果回调将不会通过代理回调结果,所以要使用代理方法回调结果的话使用方法stopRecording停止录制,优先使用stopVideoRecordWithCompletion回调,优先级排第三; videoDuration: 视频长度/秒, videoSize: 视频大小/MB, videoImage: 视频截图
 */
- (void)stopVideoRecordWithAllDetailCompletion:(void(^)(NSURL *outputFileURL, UIImage *videoImage, NSError *videoRecordError, int videoDuration, float videoSize))completion;

/**
 视频录制过程

 @param processBlock 已录制时间回调: 单位/秒
 */
- (void)watchVideoRecordProcessWithBlock:(void(^)(CGFloat processTime))processBlock;

/**
 获取视频信息

 @param videoURL 视频路径
 @param completeBlock 视频信息结果回调: videoImage: 视频截图, generatorError: 获取错误信息, videoDuration: 视频时长/s, videoFileSize: 视频大小/B
 */
- (void)videoInformationGeneratorWithVideoURL:(NSURL *)videoURL complete:(void (^)(UIImage *videoImage, NSError *generatorError,int videoDuration,NSInteger videoFileSize))completeBlock;
// 同上
+ (void)videoInformationGeneratorWithVideoURL:(NSURL *)videoURL complete:(void (^)(UIImage *videoImage, NSError *generatorError,int videoDuration,NSInteger videoFileSize))completeBlock;

/**
 镜头设置焦距
 
 @param percent 缩放倍数,取值范围0~1 : 0不放大,1放大倍数最大
 */
- (void)setVideoZoomFactorWithPercent:(CGFloat)percent;

/**
 拍照,结果通过代理回调
 */
- (void)takePicture;

/**
  拍照并回调结果

 @param completion 结果回调
 */
- (void)takePictureWithCompletion:(void(^)(UIImage *photo, NSString *photoFilePath, NSError *photographError))completion;

/**
 切换摄像头
 */
- (void)toggleCamera;

/**
 聚焦

 @param point 聚焦的点
 */
- (void)focusAtPoint:(CGPoint)point;

/**
 保存照片到相册: 功能性方法,后续考虑转移该功能到其他类

 @param photo 要保存的照片
 @param completion 保存结果回调
 */
- (void)savePhoto:(UIImage *)photo toPhotosAlbumWithCompletion:(void(^)(BOOL saveResult, NSError *saveError))completion;

/**
 保存视频到相册: 功能性方法,后续考虑转移该功能到其他类

 @param videoURL 视频路径
 @param completion 保存结果回调
 */
- (void)saveVideo:(NSURL *)videoURL toPhotosAlbumWithCompletion:(void(^)(BOOL saveResult, NSError *saveError))completion;

/**
 开始录音,结果通过代理回调
 */
- (void)startAudioRecord;

/**
 停止录音
 */
- (void)stopAudioRecord;

/**
 停止录音

 @param completion 录音结果
 */
- (void)stopAudioRecordWithCompletion:(void (^)(NSString *audioFilePath, NSError *audioRecordError))completion;


/**
 异步错误:异步监听发生的错误信息,一有错误发生就会回调
 
 @param errorBlock 错误回调
 */
- (void)asyncMonitorError:(void(^)(NSError *error))errorBlock;


/**
 开始采集:和方法endCapture成对使用
 */
- (void)beginCapture;

/**
 停止采集:和方法beginCapture成对使用
 */
- (void)endCapture;



@end





